由於每一個項目都會有一個新的View,當項目增加時,View也會越來越多導致效能低落。
藉由設計一個新類別來儲存View中的所有元件,並以畫面中可呈現的數量產生View實體,將資訊進行替換,以實現重複利用。
由於View是由Adapter產生,所以ViewHolder會設計在Adapter內。
將滾動後產生的新View視為冗餘,只要把即將離開清單元件的View作為下一個即將進入清單元件的View的容器,並將內容替換,必免產生新的View,這樣的設計稱為「畫面複用」。
建立一個ViewHolder類別,裡面存放畫面的元件
private class ViewHolder(v: View){
//連結畫面中的元件
val img_photo = v.findViewById<ImageView>(R.id.img_photo)
val tv_msg = v.findViewById<TextView>(R.id.tv_msg)
}
改寫getView()方法
override fun getView(position: Int,convertView: View?,parent: ViewGroup): View{
val view: View
val holder: ViewHolder
if (convertView == null){
//依據傳入Layout建立畫面
view = View.inflate(parent.context, layout, null)
holder = ViewHolder(view)
//為View加上標籤以重複使用
view.tag = holder
} else {
holder = convertView.tag as ViewHolder
view = convertView
}
//回傳此項目的畫面
return view
}